Introduction

Resolving geographic units that do not neatly coincide is a common problem in spatial data analysis. The method outline here attempts to conflate King County Health Reporting Areas (HRAs) to US Census tracts. In the cases where a given tract is entirely within an HRA, that tract receives the HRA’s unique identifier (HRA_ID). On the other hand, in cases where a given tract overlaps multiple HRAs, block-level census data is used to determine which HRA ID to assign to the tract.

Census Block Counts

This method provides three alternatives of block-level counts that can be used:

Count Type Variable ID Source
Population POP Table P1, U.S. Census Bureau, 2010 Census
Housing Units HU Table H1, U.S. Census Bureau, 2010 Census
Population in Housing Units HUPOP Table H10, U.S. Census Bureau, 2010 Census

The Algorithm

The following actions are performed in this method:

  1. Centroids of the census block polygons are calculated (class = SpatialPointsDataFrame)
  2. HRA IDs are passed to the block centroid using a spatial overlay method (sp::over())
  3. Blocks are aggregated into tracts and the count variables (POP,HU,POPHU) are summed
  4. For each count variable, the HRA ID with the highest sum is assigned to each tract

After running the assignment algorithm, it is clear that the POP and POPHU variables result in the same HRA assignments. HU differs from the other two variables in three of the tracts:

GEOID_TR HRA_POP HRA_POPHU HRA_HU
53033022202 Kirkland North Kirkland North Kirkland
53033025001 Bellevue-South Bellevue-South Newcastle/Four Creeks
53033028801 SeaTac/Tukwila SeaTac/Tukwila Des Moines/Normandy Park

Maps

LS0tCmFsd2F5c19hbGxvd19odG1sOiB5ZXMKZGZfcHJpbnQ6IHRpYmJsZQpvdXRwdXQ6CiAgaHRtbF9ub3RlYm9vazoKICAgIGNvZGVfZm9sZGluZzogaGlkZQogIGh0bWxfZG9jdW1lbnQ6IGRlZmF1bHQKICBwZGZfZG9jdW1lbnQ6CiAgICBrZWVwX3RleDogeWVzCi0tLQoKYGBge3IgaHJhLXRyLXNldHVwLCBlY2hvID0gRkFMU0UsIHdhcm5pbmc9RkFMU0UsbWVzc2FnZT1GQUxTRSxjb21tZW50PUZBTFNFfQpsaWJyYXJ5KHBseXIpCmxpYnJhcnkoa25pdHIpCmxpYnJhcnkocnByb2pyb290KQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShyZ2RhbCkKbGlicmFyeShzcCkKbGlicmFyeShyZ2VvcykKbGlicmFyeShtaXNjZ2lzKQpsaWJyYXJ5KHRpZ3JpcykKbGlicmFyeShsZWFmbGV0KQpsaWJyYXJ5KGdndGhlbWVzKQpsaWJyYXJ5KG1hZ3JpdHRyKQpsaWJyYXJ5KHN0cmluZ3IpCmxpYnJhcnkoZG93bmxvYWRlcikKbGlicmFyeSh3ZWJzaG90KQpsaWJyYXJ5KGh0bWx0b29scykKbGlicmFyeShncGxvdHMpCmxpYnJhcnkoZ2dtYXApCmxpYnJhcnkoc2hpbnkpCmxpYnJhcnkoaHRtbHdpZGdldHMpCmxpYnJhcnkocmVhZHhsKQpsaWJyYXJ5KGFjcykKbGlicmFyeShSQ29sb3JCcmV3ZXIpCnJvb3QgPC0gcnByb2pyb290Ojppc19yc3R1ZGlvX3Byb2plY3QKcm9vdF9maWxlIDwtIHJvb3QkbWFrZV9maXhfZmlsZSgpCm9wdHNfY2h1bmskc2V0KGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGNvbW1lbnQ9RkFMU0UpCmBgYAoKIyMjIEludHJvZHVjdGlvbgpSZXNvbHZpbmcgZ2VvZ3JhcGhpYyB1bml0cyB0aGF0IGRvIG5vdCBuZWF0bHkgY29pbmNpZGUgaXMgYSBjb21tb24gcHJvYmxlbSBpbiBzcGF0aWFsIGRhdGEgYW5hbHlzaXMuIFRoZSBtZXRob2Qgb3V0bGluZSBoZXJlIGF0dGVtcHRzIHRvIGNvbmZsYXRlIEtpbmcgQ291bnR5IEhlYWx0aCBSZXBvcnRpbmcgQXJlYXMgKEhSQXMpIHRvIFVTIENlbnN1cyB0cmFjdHMuIEluIHRoZSBjYXNlcyB3aGVyZSBhIGdpdmVuIHRyYWN0IGlzIGVudGlyZWx5IHdpdGhpbiBhbiBIUkEsIHRoYXQgdHJhY3QgcmVjZWl2ZXMgdGhlIEhSQSdzIHVuaXF1ZSBpZGVudGlmaWVyIChIUkFfSUQpLiBPbiB0aGUgb3RoZXIgaGFuZCwgaW4gY2FzZXMgd2hlcmUgYSBnaXZlbiB0cmFjdCBvdmVybGFwcyBtdWx0aXBsZSBIUkFzLCBibG9jay1sZXZlbCBjZW5zdXMgZGF0YSBpcyB1c2VkIHRvIGRldGVybWluZSB3aGljaCBIUkEgSUQgdG8gYXNzaWduIHRvIHRoZSB0cmFjdC4gCgojIyMgQ2Vuc3VzIEJsb2NrIENvdW50cwpUaGlzIG1ldGhvZCBwcm92aWRlcyB0aHJlZSBhbHRlcm5hdGl2ZXMgb2YgYmxvY2stbGV2ZWwgY291bnRzIHRoYXQgY2FuIGJlIHVzZWQ6CgpgYGB7ciBocmEtdHItdmFydGFibGUsIGZpZy5jYXA9J0Jsb2NrLWxldmVsIGNvdW50cyd9CnRpYmJsZSgnQ291bnQgVHlwZScgPSBjKCdQb3B1bGF0aW9uJywKICAgICAgICAgICAgICAgICAgICAgICAgJ0hvdXNpbmcgVW5pdHMnLAogICAgICAgICAgICAgICAgICAgICAgICAnUG9wdWxhdGlvbiBpbiBIb3VzaW5nIFVuaXRzJyksCiAgICAgICAnVmFyaWFibGUgSUQnID0gYygnYFBPUGAnLAogICAgICAgICAgICAgICAgICAgICAgICAgJ2BIVWAnLAogICAgICAgICAgICAgICAgICAgICAgICAgJ2BIVVBPUGAnKSwKICAgICAgICdTb3VyY2UnID0gYygnVGFibGUgUDEsIFUuUy4gQ2Vuc3VzIEJ1cmVhdSwgMjAxMCBDZW5zdXMnLAogICAgICAgICAgICAgICAgICAgICdUYWJsZSBIMSwgVS5TLiBDZW5zdXMgQnVyZWF1LCAyMDEwIENlbnN1cycsCiAgICAgICAgICAgICAgICAgICAgJ1RhYmxlIEgxMCwgVS5TLiBDZW5zdXMgQnVyZWF1LCAyMDEwIENlbnN1cycpKSAlPiUgCiAgICAgICAga2FibGUoKQpgYGAKCiAgCmBgYHtyIGhyYS10ci1ibGtzfQoKaWYoIWZpbGUuZXhpc3RzKHJvb3RfZmlsZSgnMS1kYXRhLzQtaW50ZXJpbS9rYy1ibGstc3AuZ3BrZycpKSl7CiAgICAgICAgcG9wIDwtIHJlYWRfY3N2KHJvb3RfZmlsZSgnMS1kYXRhLzMtZXh0ZXJuYWwvbWFudWFsL3dhLWJsay9ERUNfMTBfU0YxX1AxL0RFQ18xMF9TRjFfUDFfd2l0aF9hbm4uY3N2JyksIAogICAgICAgICAgICAgICAgICAgICAgICBjb2xfdHlwZXMgPSBjb2xzKElkMiA9IGNvbF9jaGFyYWN0ZXIoKSksIAogICAgICAgICAgICAgICAgICAgICAgICBza2lwID0gMSkgJT4lIAogICAgICAgICAgICAgICAgbXV0YXRlKEdFT19JRF9CTEsgPSBJZDIsCiAgICAgICAgICAgICAgICAgICAgICAgR0VPSURfVFIgPSBzdWJzdHIoSWQyLHN0YXJ0ID0gMSxzdG9wID0gMTEpLAogICAgICAgICAgICAgICAgICAgICAgIFBPUCA9IFRvdGFsKSAlPiUgCiAgICAgICAgICAgICAgICBzZWxlY3QoR0VPX0lEX0JMSyxHRU9JRF9UUixQT1ApCiAgICAgICAgCiAgICAgICAgaHUgPC0gcmVhZF9jc3Yocm9vdF9maWxlKCcxLWRhdGEvMy1leHRlcm5hbC9tYW51YWwvd2EtYmxrL0RFQ18xMF9TRjFfSDEvREVDXzEwX1NGMV9IMV93aXRoX2Fubi5jc3YnKSwgCiAgICAgICAgICAgICAgICAgICAgICAgY29sX3R5cGVzID0gY29scyhJZDIgPSBjb2xfY2hhcmFjdGVyKCkpLCAKICAgICAgICAgICAgICAgICAgICAgICBza2lwID0gMSkgJT4lIAogICAgICAgICAgICAgICAgbXV0YXRlKEdFT19JRF9CTEsgPSBJZDIsCiAgICAgICAgICAgICAgICAgICAgICAgSFUgPSBUb3RhbCkgJT4lIAogICAgICAgICAgICAgICAgc2VsZWN0KEdFT19JRF9CTEssSFUpCiAgICAgICAgCiAgICAgICAgcG9waHUgPC0gcmVhZF9jc3Yocm9vdF9maWxlKCcxLWRhdGEvMy1leHRlcm5hbC9tYW51YWwvd2EtYmxrL0RFQ18xMF9TRjFfSDEwL0RFQ18xMF9TRjFfSDEwX3dpdGhfYW5uLmNzdicpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xfdHlwZXMgPSBjb2xzKElkMiA9IGNvbF9jaGFyYWN0ZXIoKSksIAogICAgICAgICAgICAgICAgICAgICAgICAgIHNraXAgPSAxKSAlPiUgCiAgICAgICAgICAgICAgICBtdXRhdGUoR0VPX0lEX0JMSyA9IElkMiwKICAgICAgICAgICAgICAgICAgICAgICBQT1BIVSA9IFRvdGFsKSAlPiUgCiAgICAgICAgICAgICAgICBzZWxlY3QoR0VPX0lEX0JMSyxQT1BIVSkKICAgICAgICAKICAgICAgICBjbnRzIDwtIGxlZnRfam9pbihwb3AsaHUsYnkgPSAnR0VPX0lEX0JMSycpICU+JSAKICAgICAgICAgICAgICAgIGxlZnRfam9pbihwb3BodSxieSA9ICdHRU9fSURfQkxLJykKICAgICAgICAKICAgICAgICAjIFNvdXJjZSBmb3IgS0MgQmxvY2tzIHNwYXRpYWwgZGF0YQogICAgICAgIGlmKCFmaWxlLmV4aXN0cyhyb290X2ZpbGUoJzEtZGF0YS8zLWV4dGVybmFsL3dhLWJsay9ibG9ja3MxMC9ibG9ja3MxMC5zaHAnKSkpewogICAgICAgICAgICAgICAgdXJsIDwtICdmdHA6Ly9mdHAua2luZ2NvdW50eS5nb3YvZ2lzLXdlYi93ZWIvR0lTRGF0YS9ibG9ja3MxMF9TSFAuemlwJyAjIGRpcmVjdCBVUkwgdG8gdGhlIGZpbGUgZG93bmxvYWQKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdGVtcCA8LSB0ZW1wZmlsZSgpICMgY3JlYXRlIGEgdGVtcG9yYXJ5IGZpbGUgdG8gaG9sZCB0aGUgY29tcHJlc3NlZCBkb3dubG9hZAogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBkb3dubG9hZCh1cmwsIGRlc3QgPSB0ZW1wLCBtb2RlPSd3YicpICMgZG93bmxvYWQgdGhlIGZpbGUKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdW56aXAgKHRlbXAsIGV4ZGlyID0gcm9vdF9maWxlKCcxLWRhdGEvMy1leHRlcm5hbC93YS1ibGsnKSkgIyBleHRyYWN0IHRoZSBmaWxlIHRvIHRoZSBwcm9qZWN0IGZvbGRlcgogICAgICAgIH0KICAgICAgICAKICAgICAgICBrY19ibGsgPC0gcmVhZE9HUihkc24gPSByb290X2ZpbGUoJzEtZGF0YS8zLWV4dGVybmFsL3dhLWJsay9ibG9ja3MxMC8nKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBsYXllciA9ICdibG9ja3MxMCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyYm9zZSA9IEZBTFNFLAogICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ3NBc0ZhY3RvcnMgPSBGQUxTRSkKICAgICAgICAKICAgICAgICBrY19ibGtAZGF0YSAlPD4lIGxlZnRfam9pbihjbnRzLCBieSA9ICdHRU9fSURfQkxLJykgJT4lIAogICAgICAgICAgICAgICAgc2VsZWN0KEdFT0lEX0JMSyA9IEdFT19JRF9CTEssCiAgICAgICAgICAgICAgICAgICAgICAgR0VPSURfVFI6UE9QSFUpCiAgICAgICAgCiAgICAgICAga2NfYmxrICU+JSB3cml0ZU9HUihkc24gPSByb290X2ZpbGUoJzEtZGF0YS80LWludGVyaW0va2MtYmxrLXNwLmdwa2cnKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyID0gJ2tjX2Jsa19zcCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcml2ZXIgPSAnR1BLRycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdmVyd3JpdGVfbGF5ZXIgPSBUUlVFLHZlcmJvc2UgPSBGQUxTRSkKfQoKa2NfYmxrX3NwIDwtIHJlYWRPR1IoZHNuID0gcm9vdF9maWxlKCcxLWRhdGEvNC1pbnRlcmltL2tjLWJsay1zcC5ncGtnJyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXllciA9ICdrY19ibGtfc3AnLAogICAgICAgICAgICAgICAgICBzdHJpbmdzQXNGYWN0b3JzID0gRkFMU0UsCiAgICAgICAgICAgICAgICAgIHZlcmJvc2UgPSBGQUxTRSkKCgoKYGBgCgoKIyMjIFRoZSBBbGdvcml0aG0gClRoZSBmb2xsb3dpbmcgYWN0aW9ucyBhcmUgcGVyZm9ybWVkIGluIHRoaXMgbWV0aG9kOgoKICAxLiBDZW50cm9pZHMgb2YgdGhlIGNlbnN1cyBibG9jayBwb2x5Z29ucyBhcmUgY2FsY3VsYXRlZCAoYGNsYXNzID0gU3BhdGlhbFBvaW50c0RhdGFGcmFtZWApCiAgMi4gSFJBIElEcyBhcmUgcGFzc2VkIHRvIHRoZSBibG9jayBjZW50cm9pZCB1c2luZyBhIHNwYXRpYWwgb3ZlcmxheSBtZXRob2QgKGBzcDo6b3ZlcigpYCkKICAzLiBCbG9ja3MgYXJlIGFnZ3JlZ2F0ZWQgaW50byB0cmFjdHMgYW5kIHRoZSBjb3VudCB2YXJpYWJsZXMgKGBQT1BgLGBIVWAsYFBPUEhVYCkgYXJlIHN1bW1lZAogIDQuIEZvciBlYWNoIGNvdW50IHZhcmlhYmxlLCB0aGUgSFJBIElEIHdpdGggdGhlIGhpZ2hlc3Qgc3VtIGlzIGFzc2lnbmVkIHRvIGVhY2ggdHJhY3QKICAKYGBge3IgaHJhLWFzc2lnbn0KCiMgUGFzcyBIUkEgSURzIHRvIHRoZSBibG9jayBjZW50cm9pZHMKaHJhIDwtIHJlYWRPR1IoZHNuID0gcm9vdF9maWxlKCcxLWRhdGEvMy1leHRlcm5hbC9tYW51YWwvSFJBXzIwMTBCbG9ja19DbGlwLycpLGxheWVyID0gJ0hSQV8yMDEwQmxvY2tfQ2xpcCcsCiAgICAgICAgICAgICAgIHZlcmJvc2UgPSBGQUxTRSxzdHJpbmdzQXNGYWN0b3JzID0gRkFMU0UpCgprY19ibGtfY250X3NwIDwtIFNwYXRpYWxQb2ludHNEYXRhRnJhbWUoY29vcmRzID0gcmdlb3M6OmdDZW50cm9pZChrY19ibGtfc3AsYnlpZCA9IFRSVUUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGFzLmRhdGEuZnJhbWUoa2NfYmxrX3NwQGRhdGEpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2guSUQgPSBGQUxTRSkKCmtjX2Jsa19jbnRfc3AkSFJBX0lEIDwtIHNwOjpvdmVyKGtjX2Jsa19jbnRfc3AsaHJhWywnSFJBMjAxMHYyXyddKSAlPiUgdW5saXN0CgprY19ibGtfY250X3NwQGRhdGEgJTw+JSBtdXRhdGUoSFJBX0lEID0gaWZlbHNlKGlzLm5hKEhSQV9JRCksJ05vbmUnLEhSQV9JRCkpCgoKIyBBc3NpZ24gSFJBcyB0byB0cmFjdHMKIAppZighZmlsZS5leGlzdHMocm9vdF9maWxlKCcxLWRhdGEvNC1pbnRlcmltL2tjLWhyYS10ci1zcC5ncGtnJykpKXsKICAgICAgICBpZighZmlsZS5leGlzdHMocm9vdF9maWxlKCcxLWRhdGEvMy1leHRlcm5hbC9rYy10ci90cmFjdHMxMF9zaG9yZS90cmFjdHMxMF9zaG9yZS5zaHAnKSkpewogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB1cmwgPC0gJ2Z0cDovL2Z0cC5raW5nY291bnR5Lmdvdi9naXMtd2ViL3dlYi9HSVNEYXRhL3RyYWN0czEwX3Nob3JlX1NIUC56aXAnICMgZGlyZWN0IFVSTCB0byB0aGUgZmlsZSBkb3dubG9hZAogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB0ZW1wIDwtIHRlbXBmaWxlKCkgIyBjcmVhdGUgYSB0ZW1wb3JhcnkgZmlsZSB0byBob2xkIHRoZSBjb21wcmVzc2VkIGRvd25sb2FkCiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIGRvd25sb2FkKHVybCwgZGVzdCA9IHRlbXAsIG1vZGU9J3diJykgIyBkb3dubG9hZCB0aGUgZmlsZQogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB1bnppcCAodGVtcCwgZXhkaXIgPSByb290X2ZpbGUoJzEtZGF0YS8zLWV4dGVybmFsL2tjLXRyJykpICMgZXh0cmFjdCB0aGUgZmlsZSB0byB0aGUgcHJvamVjdCBmb2xkZXIKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgCiAgICAgICAgfQogICAgICAgICAKICAgICAgICBrY190cl9zcCA8LSByZWFkT0dSKGRzbiA9IHJvb3RfZmlsZSgnMS1kYXRhLzMtZXh0ZXJuYWwva2MtdHIvdHJhY3RzMTBfc2hvcmUvJyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXllciA9ICd0cmFjdHMxMF9zaG9yZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJib3NlID0gRkFMU0UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdzQXNGYWN0b3JzID0gRkFMU0UpCiAgICAgICAga2NfdHJfc3BAZGF0YSAlPD4lIHNlbGVjdChHRU9JRF9UUiA9IEdFT19JRF9UUlQpCiAgICAgICAgCiAgICAgICAgZmlyc3Rfbm90TkEgPC0gZnVuY3Rpb24oeCl7Zmlyc3QoeFshaXMubmEoeCldKX0KICAgICAgICAKICAgICAgICB0cl9ocmFfaWRzIDwtIAogICAgICAgICAgICAgICAga2NfYmxrX2NudF9zcEBkYXRhICU+JSAKICAgICAgICAgICAgICAgIGFzLmRhdGEuZnJhbWUoKSAlPiUgCiAgICAgICAgICAgICAgICBnYXRoZXIoJ1ZBUicsJ0NPVU5UJyxQT1A6UE9QSFUpICU+JSAKICAgICAgICAgICAgICAgIGdyb3VwX2J5KEdFT0lEX1RSLFZBUixIUkFfSUQpICU+JSAKICAgICAgICAgICAgICAgIHN1bW1hcmlzZShTVU0gPSBzdW0oQ09VTlQpKSAlPiUgCiAgICAgICAgICAgICAgICBhcnJhbmdlKGRlc2MoU1VNKSkgJT4lIAogICAgICAgICAgICAgICAgc2xpY2UoMSkgJT4lIAogICAgICAgICAgICAgICAgc3ByZWFkKFZBUixIUkFfSUQpICU+JSAKICAgICAgICAgICAgICAgIG11dGF0ZShIVV9DTlQgPSBpZmVsc2UoIWlzLm5hKEhVKSxTVU0sTkFfaW50ZWdlcl8pLAogICAgICAgICAgICAgICAgICAgICAgIFBPUF9DTlQgPSBpZmVsc2UoIWlzLm5hKFBPUCksU1VNLE5BX2ludGVnZXJfKSwKICAgICAgICAgICAgICAgICAgICAgICBQT1BIVV9DTlQgPSBpZmVsc2UoIWlzLm5hKFBPUEhVKSxTVU0sTkFfaW50ZWdlcl8pKSAlPiUgCiAgICAgICAgICAgICAgICBzZWxlY3QoLVNVTSkgJT4lIAogICAgICAgICAgICAgICAgZ3JvdXBfYnkoR0VPSURfVFIpICU+JSAKICAgICAgICAgICAgICAgIHN1bW1hcmlzZV9hbGwoZnVucyhmaXJzdF9ub3ROQSkpICU+JSAKICAgICAgICAgICAgICAgIHVuZ3JvdXAoKSAlPiUgCiAgICAgICAgICAgICAgICBzZWxlY3QoR0VPSURfVFIsCiAgICAgICAgICAgICAgICAgICAgICAgUE9QID0gUE9QX0NOVCwKICAgICAgICAgICAgICAgICAgICAgICBIVSA9IEhVX0NOVCwKICAgICAgICAgICAgICAgICAgICAgICBQT1BIVSA9IFBPUEhVX0NOVCwKICAgICAgICAgICAgICAgICAgICAgICBIUkFfUE9QID0gUE9QLAogICAgICAgICAgICAgICAgICAgICAgIEhSQV9IVSA9IEhVLAogICAgICAgICAgICAgICAgICAgICAgIEhSQV9QT1BIVSA9IFBPUEhVKQogICAgICAgIAogICAgICAgIHRyX2hyYV9pZHMyIDwtIAogICAgICAgICAgICAgICAgdHJfaHJhX2lkcyAlPiUgCiAgICAgICAgICAgICAgICBzZWxlY3QoR0VPSURfVFIsbWF0Y2hlcygnSFJBJykpICU+JSAKICAgICAgICAgICAgICAgIGdhdGhlcigiVkFSIiwiSFJBIixtYXRjaGVzKCdIUkEnKSkgJT4lICAKICAgICAgICAgICAgICAgIGdyb3VwX2J5KEdFT0lEX1RSKSAlPiUgCiAgICAgICAgICAgICAgICBzdW1tYXJpc2UoQUxMRVEgPSBsZW5ndGgodW5pcXVlKEhSQSkpPT0xKSAlPiUKICAgICAgICAgICAgICAgIGxlZnRfam9pbih0cl9ocmFfaWRzLC4sYnkgPSAnR0VPSURfVFInKSAKICAgICAgICAKICAgICAgICAjIEdldCB0aGUgcGVyY2VudGFnZSBmb3IgZWFjaCBjb3VudCB2YXJpYWJsZQogICAgICAgIAogICAgICAgIHBvcF90ciA8LSAKICAgICAgICAgICAgICAgIHJlYWRfY3N2KHJvb3RfZmlsZSgiMS1kYXRhLzMtZXh0ZXJuYWwvbWFudWFsL2tjLXRyL0RFQ18xMF9TRjFfUDEvREVDXzEwX1NGMV9QMV93aXRoX2Fubi5jc3YiKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICBjb2xfdHlwZXMgPSBjb2xzKEdFTy5pZDIgPSBjb2xfY2hhcmFjdGVyKCksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZW9ncmFwaHkgPSBjb2xfc2tpcCgpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWQgPSBjb2xfc2tpcCgpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWQyID0gY29sX2NoYXJhY3RlcigpKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICBza2lwID0gMSkgJT4lIAogICAgICAgICAgICAgICAgc2VsZWN0KEdFT0lEX1RSID0gSWQyLAogICAgICAgICAgICAgICAgICAgICAgIFBPUF9UUiA9IFRvdGFsKQogICAgICAgIAogICAgICAgIGh1X3RyIDwtIAogICAgICAgICAgICAgICAgcmVhZF9jc3Yocm9vdF9maWxlKCcxLWRhdGEvMy1leHRlcm5hbC9tYW51YWwva2MtdHIvREVDXzEwX1NGMV9IMS9ERUNfMTBfU0YxX0gxX3dpdGhfYW5uLmNzdicpLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbF90eXBlcyA9IGNvbHMoR0VPLmlkMiA9IGNvbF9jaGFyYWN0ZXIoKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdlb2dyYXBoeSA9IGNvbF9za2lwKCksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZCA9IGNvbF9za2lwKCksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZDIgPSBjb2xfY2hhcmFjdGVyKCkpLCAKICAgICAgICAgICAgICAgICAgICAgICAgIHNraXAgPSAxKSU+JSAKICAgICAgICAgICAgICAgIHNlbGVjdChHRU9JRF9UUiA9IElkMiwKICAgICAgICAgICAgICAgICAgICAgICBIVV9UUiA9IFRvdGFsKQogICAgICAgIAogICAgICAgIHBvcGh1X3RyIDwtIAogICAgICAgICAgICAgICAgcmVhZF9jc3Yocm9vdF9maWxlKCcxLWRhdGEvMy1leHRlcm5hbC9tYW51YWwva2MtdHIvREVDXzEwX1NGMV9IMTAvREVDXzEwX1NGMV9IMTBfd2l0aF9hbm4uY3N2JyksIAogICAgICAgICAgICAgICAgICAgICAgICAgY29sX3R5cGVzID0gY29scyhHRU8uaWQyID0gY29sX2NoYXJhY3RlcigpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2VvZ3JhcGh5ID0gY29sX3NraXAoKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElkID0gY29sX3NraXAoKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElkMiA9IGNvbF9jaGFyYWN0ZXIoKSksIAogICAgICAgICAgICAgICAgICAgICAgICAgc2tpcCA9IDEpICU+JSAKICAgICAgICAgICAgICAgIHNlbGVjdChHRU9JRF9UUiA9IElkMiwKICAgICAgICAgICAgICAgICAgICAgICBQT1BIVV9UUiA9IFRvdGFsKQogICAgICAgIAogICAgICAgIGtjX3RyX3NwQGRhdGEgJTw+JQogICAgICAgICAgICAgICAgbGVmdF9qb2luKC4sdHJfaHJhX2lkczIsYnkgPSAnR0VPSURfVFInKSAlPiUgCiAgICAgICAgICAgICAgICBsZWZ0X2pvaW4oLixwb3BfdHIsYnkgPSAnR0VPSURfVFInKSAlPiUgCiAgICAgICAgICAgICAgICBsZWZ0X2pvaW4oLixodV90cixieSA9ICdHRU9JRF9UUicpICU+JSAKICAgICAgICAgICAgICAgIGxlZnRfam9pbiguLHBvcGh1X3RyLGJ5ID0gJ0dFT0lEX1RSJykgJT4lIAogICAgICAgICAgICAgICAgbXV0YXRlKFBPUF9QQ1QgPSByb3VuZF9hbnkoUE9QL1BPUF9UUixhY2N1cmFjeSA9IC4wMSksCiAgICAgICAgICAgICAgICAgICAgICAgSFVfUENUID0gcm91bmRfYW55KEhVL0hVX1RSLGFjY3VyYWN5ID0gLjAxKSwKICAgICAgICAgICAgICAgICAgICAgICBQT1BIVV9QQ1QgPSByb3VuZF9hbnkoUE9QSFUvUE9QSFVfVFIsYWNjdXJhY3kgPSAuMDEpKSAlPiUgCiAgICAgICAgICAgICAgICBzZWxlY3QoR0VPSURfVFIsCiAgICAgICAgICAgICAgICAgICAgICAgUE9QLFBPUF9QQ1QsCiAgICAgICAgICAgICAgICAgICAgICAgSFUsIEhVX1BDVCwKICAgICAgICAgICAgICAgICAgICAgICBQT1BIVSwgUE9QSFVfUENULGV2ZXJ5dGhpbmcoKSkKICAgICAgICAKICAgICAgICBrY190cl9zcCAlPiUgCiAgICAgICAgICAgICAgICB3cml0ZU9HUihkc24gPSByb290X2ZpbGUoJzEtZGF0YS80LWludGVyaW0va2MtaHJhLXRyLXNwLmdwa2cnKSwKICAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyID0gJ2tjX2hyYV90cl9zcCcsCiAgICAgICAgICAgICAgICAgICAgICAgICBkcml2ZXIgPSAnR1BLRycsCiAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJib3NlID0gRkFMU0UsCiAgICAgICAgICAgICAgICAgICAgICAgICBvdmVyd3JpdGVfbGF5ZXIgPSBUUlVFKQogICAgICAgIAp9CgprY19ocmFfdHJfc3AgPC0gCiAgICAgICAgcmVhZE9HUihkc24gPSByb290X2ZpbGUoJzEtZGF0YS80LWludGVyaW0va2MtaHJhLXRyLXNwLmdwa2cnKSwKICAgICAgICAgICAgICAgIGxheWVyID0gJ2tjX2hyYV90cl9zcCcsCiAgICAgICAgICAgICAgICB2ZXJib3NlID0gRkFMU0UpICU+JSAKICAgICAgICBzcFRyYW5zZm9ybShjcnNfcHJvaikKCmBgYAoKQWZ0ZXIgcnVubmluZyB0aGUgYXNzaWdubWVudCBhbGdvcml0aG0sIGl0IGlzIGNsZWFyIHRoYXQgdGhlIGBQT1BgIGFuZCBgUE9QSFVgIHZhcmlhYmxlcyByZXN1bHQgaW4gdGhlIHNhbWUgSFJBIGFzc2lnbm1lbnRzLiBgSFVgIGRpZmZlcnMgZnJvbSB0aGUgb3RoZXIgdHdvIHZhcmlhYmxlcyBpbiB0aHJlZSBvZiB0aGUgdHJhY3RzOgoKYGBge3IgaHJhLWFzc2lnbi1yZXN1bHRzLCBmaWcuY2FwPSdEaWZmZXJlbmNlIGJldHdlZW4gdGhlIG1ldGhvZHMnfQoKa2NfaHJhX3RyX3NwQGRhdGEgJT4lIAogICAgICAgIG11dGF0ZShBTExFUSA9IGFzLmxvZ2ljYWwoQUxMRVEpKSAlPiUgCiAgICAgICAgZmlsdGVyKEFMTEVRID09IEZBTFNFKSAlPiUgCiAgICAgICAgc2VsZWN0KEdFT0lEX1RSLEhSQV9QT1AsSFJBX1BPUEhVLEhSQV9IVSkgJT4lIAogICAgICAgIGthYmxlKGNhcHRpb24gPSAnRGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBtZXRob2RzJykKCmBgYAoKCiMjIyBNYXBzCgoKYGBge3IgaHJhLW1ha2UtbWFwc30KCm15cGFsIDwtIFJDb2xvckJyZXdlcjo6YnJld2VyLnBhbCg4LG5hbWUgPSAnU2V0MicpWy04XQoKc2h1ZmZsZWRfaHJhX3BvcCA8LSBmb3JjYXRzOjpmY3Rfc2h1ZmZsZShrY19ocmFfdHJfc3AkSFJBX1BPUCkgJT4lIGZhY3RvcihvcmRlcmVkID0gVCkKc2h1ZmZsZWRfaHJhX2h1IDwtIGZvcmNhdHM6OmZjdF9zaHVmZmxlKGtjX2hyYV90cl9zcCRIUkFfSFUpICU+JSBmYWN0b3Iob3JkZXJlZCA9IFQpCnNodWZmbGVkX2hyYV9wb3BodSA8LSBmb3JjYXRzOjpmY3Rfc2h1ZmZsZShrY19ocmFfdHJfc3AkSFJBX1BPUEhVKSAlPiUgZmFjdG9yKG9yZGVyZWQgPSBUKQoKcGFsX3BvcCA8LSBjb2xvckZhY3RvcihwYWxldHRlID0gbXlwYWwsZG9tYWluID0gc2h1ZmZsZWRfaHJhX3BvcCkKcGFsX2h1IDwtIGNvbG9yRmFjdG9yKHBhbGV0dGUgPSBteXBhbCxkb21haW4gPSBzaHVmZmxlZF9ocmFfaHUpCnBhbF9wb3BodSA8LSBjb2xvckZhY3RvcihwYWxldHRlID0gbXlwYWwsZG9tYWluID0gc2h1ZmZsZWRfaHJhX3BvcGh1KQoKaHJhICU8PiUgc3BUcmFuc2Zvcm0oY3JzX3Byb2opCgpzaG93X2hyYV90cl9wb3AgPC0gZnVuY3Rpb24oKXsKICAgICAgICBteUxmbHRHcmV5KGJ1bXBMYWJlbHMgPSBGQUxTRSxoaWRlQ29udHJvbHMgPSBGQUxTRSkgJT4lCiAgICAgICAgYWRkUHJvdmlkZXJUaWxlcyhwcm92aWRlcnMkQ2FydG9EQikgJT4lIAogICAgICAgIGFkZFBvbHlnb25zKGRhdGEgPSBrY19ocmFfdHJfc3AsCiAgICAgICAgICAgICAgICAgICAgc21vb3RoRmFjdG9yID0gMCwKICAgICAgICAgICAgICAgICAgICB3ZWlnaHQgPSAxLAogICAgICAgICAgICAgICAgICAgIGNvbG9yID0gY29sMmhleCgid2hpdGUiKSwKICAgICAgICAgICAgICAgICAgICBvcGFjaXR5ID0gLjg1LAogICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvciA9IH5wYWxfcG9wKHNodWZmbGVkX2hyYV9wb3ApLAogICAgICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5ID0gLjUsCiAgICAgICAgICAgICAgICAgICAgZ3JvdXAgPSAnSFJBIFRyYWN0IGJ5IFBvcC4nLAogICAgICAgICAgICAgICAgICAgIHBvcHVwID0gfnBhc3RlMChrY19ocmFfdHJfc3AkR0VPSURfVFIpKSAlPiUgCiAgICAgICAgYWRkUG9seWdvbnMoZGF0YSA9IGhyYSwKICAgICAgICAgICAgICAgICAgICBzbW9vdGhGYWN0b3IgPSAwLAogICAgICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5ID0gMCwKICAgICAgICAgICAgICAgICAgICB3ZWlnaHQgPSAyLAogICAgICAgICAgICAgICAgICAgIGNvbG9yID0gfnBhbF9wb3AoZmFjdG9yKGhyYSRIUkEyMDEwdjJfLGxldmVscyA9IGxldmVscyhzaHVmZmxlZF9ocmFfcG9wKSxvcmRlcmVkID0gVFJVRSkpLAogICAgICAgICAgICAgICAgICAgIG9wYWNpdHkgPSAxLAogICAgICAgICAgICAgICAgICAgIGdyb3VwID0gJ0hSQXMnLAogICAgICAgICAgICAgICAgICAgIHBvcHVwID0gfnBhc3RlMChocmEkSFJBMjAxMHYyXykpICU+JSAKICAgICAgICBhZGRMYXllcnNDb250cm9sKG92ZXJsYXlHcm91cHMgPSBjKCdIUkEgVHJhY3QgYnkgUG9wLicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnSFJBcycpLAogICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24gPSAndG9wcmlnaHQnLG9wdGlvbnMgPSBsYXllcnNDb250cm9sT3B0aW9ucyhGQUxTRSkpCn0KCnNob3dfaHJhX3RyX2h1IDwtIGZ1bmN0aW9uKCl7CiAgICAgICAgbXlMZmx0R3JleShidW1wTGFiZWxzID0gRkFMU0UsaGlkZUNvbnRyb2xzID0gRkFMU0UpICU+JQogICAgICAgIGFkZFByb3ZpZGVyVGlsZXMocHJvdmlkZXJzJENhcnRvREIpICU+JSAKICAgICAgICBhZGRQb2x5Z29ucyhkYXRhID0ga2NfaHJhX3RyX3NwLAogICAgICAgICAgICAgICAgICAgIHNtb290aEZhY3RvciA9IDAsCiAgICAgICAgICAgICAgICAgICAgd2VpZ2h0ID0gMSwKICAgICAgICAgICAgICAgICAgICBjb2xvciA9IGNvbDJoZXgoIndoaXRlIiksCiAgICAgICAgICAgICAgICAgICAgb3BhY2l0eSA9IC44NSwKICAgICAgICAgICAgICAgICAgICBmaWxsQ29sb3IgPSB+cGFsX2h1KHNodWZmbGVkX2hyYV9odSksCiAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHkgPSAuNSwKICAgICAgICAgICAgICAgICAgICBncm91cCA9ICdIUkEgVHJhY3QgYnkgSFUuJywKICAgICAgICAgICAgICAgICAgICBwb3B1cCA9IH5wYXN0ZTAoa2NfaHJhX3RyX3NwJEdFT0lEX1RSKSkgJT4lIAogICAgICAgIGFkZFBvbHlnb25zKGRhdGEgPSBocmEsCiAgICAgICAgICAgICAgICAgICAgc21vb3RoRmFjdG9yID0gMCwKICAgICAgICAgICAgICAgICAgICBmaWxsT3BhY2l0eSA9IDAsCiAgICAgICAgICAgICAgICAgICAgd2VpZ2h0ID0gMiwKICAgICAgICAgICAgICAgICAgICBjb2xvciA9IH5wYWxfaHUoZmFjdG9yKGhyYSRIUkEyMDEwdjJfLGxldmVscyA9IGxldmVscyhzaHVmZmxlZF9ocmFfaHUpLG9yZGVyZWQgPSBUUlVFKSksCiAgICAgICAgICAgICAgICAgICAgb3BhY2l0eSA9IDEsCiAgICAgICAgICAgICAgICAgICAgZ3JvdXAgPSAnSFJBcycsCiAgICAgICAgICAgICAgICAgICAgcG9wdXAgPSB+cGFzdGUwKGhyYSRIUkEyMDEwdjJfKSkgJT4lIAogICAgICAgIGFkZExheWVyc0NvbnRyb2wob3ZlcmxheUdyb3VwcyA9IGMoJ0hSQSBUcmFjdCBieSBIVS4nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0hSQXMnKSwKICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gJ3RvcHJpZ2h0JyxvcHRpb25zID0gbGF5ZXJzQ29udHJvbE9wdGlvbnMoRkFMU0UpKQp9CgpzaG93X2hyYV90cl9wb3BodSA8LSBmdW5jdGlvbigpewogICAgICAgIG15TGZsdEdyZXkoYnVtcExhYmVscyA9IEZBTFNFLGhpZGVDb250cm9scyA9IEZBTFNFKSAlPiUKICAgICAgICBhZGRQcm92aWRlclRpbGVzKHByb3ZpZGVycyRDYXJ0b0RCKSAlPiUgCiAgICAgICAgYWRkUG9seWdvbnMoZGF0YSA9IGtjX2hyYV90cl9zcCwKICAgICAgICAgICAgICAgICAgICBzbW9vdGhGYWN0b3IgPSAwLAogICAgICAgICAgICAgICAgICAgIHdlaWdodCA9IDEsCiAgICAgICAgICAgICAgICAgICAgY29sb3IgPSBjb2wyaGV4KCJ3aGl0ZSIpLAogICAgICAgICAgICAgICAgICAgIG9wYWNpdHkgPSAuODUsCiAgICAgICAgICAgICAgICAgICAgZmlsbENvbG9yID0gfnBhbF9wb3BodShzaHVmZmxlZF9ocmFfcG9waHUpLAogICAgICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5ID0gLjUsCiAgICAgICAgICAgICAgICAgICAgZ3JvdXAgPSAnSFJBIFRyYWN0IGJ5IFBvcC4gaW4gSFUnLAogICAgICAgICAgICAgICAgICAgIHBvcHVwID0gfnBhc3RlMChrY19ocmFfdHJfc3AkR0VPSURfVFIpKSAlPiUgCiAgICAgICAgYWRkUG9seWdvbnMoZGF0YSA9IGhyYSwKICAgICAgICAgICAgICAgICAgICBzbW9vdGhGYWN0b3IgPSAwLAogICAgICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5ID0gMCwKICAgICAgICAgICAgICAgICAgICB3ZWlnaHQgPSAyLAogICAgICAgICAgICAgICAgICAgIGNvbG9yID0gfnBhbF9wb3BodShmYWN0b3IoaHJhJEhSQTIwMTB2Ml8sbGV2ZWxzID0gbGV2ZWxzKHNodWZmbGVkX2hyYV9wb3BodSksb3JkZXJlZCA9IFRSVUUpKSwKICAgICAgICAgICAgICAgICAgICBvcGFjaXR5ID0gMSwKICAgICAgICAgICAgICAgICAgICBncm91cCA9ICdIUkFzJywKICAgICAgICAgICAgICAgICAgICBwb3B1cCA9IH5wYXN0ZTAoaHJhJEhSQTIwMTB2Ml8pKSAlPiUgCiAgICAgICAgYWRkTGF5ZXJzQ29udHJvbChvdmVybGF5R3JvdXBzID0gYygnSFJBIFRyYWN0IGJ5IFBvcC4gaW4gSFUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0hSQXMnKSwKICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gJ3RvcHJpZ2h0JyxvcHRpb25zID0gbGF5ZXJzQ29udHJvbE9wdGlvbnMoRkFMU0UpKQp9CgojIFNhdmUgdGhlIG1hcHMgYXMgSFRNTCBkb2N1bWVudHMKCmlmKCFmaWxlLmV4aXN0cyhyb290X2ZpbGUoJzMtY29tbXVuaWNhdGlvbi9vdGhlcnMvaHRtbC9ocmEtdHJhY3RzLXBvcC5odG1sJykpKXsKICAgICAgICBzaG93X2hyYV90cl9wb3AoKSAlPiUgCiAgICAgICAgc2F2ZVdpZGdldChmaWxlID0gcm9vdF9maWxlKCczLWNvbW11bmljYXRpb24vb3RoZXJzL2h0bWwvaHJhLXRyYWN0cy1wb3AuaHRtbCcpLAogICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmY29udGFpbmVkID0gRkFMU0UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpYmRpciA9IHJvb3RfZmlsZSgnMy1jb21tdW5pY2F0aW9uL290aGVycy9odG1sL2h0bWxfc3VwcG9ydF9maWxlcycpKQp9CgppZighZmlsZS5leGlzdHMocm9vdF9maWxlKCczLWNvbW11bmljYXRpb24vb3RoZXJzL2h0bWwvaHJhLXRyYWN0cy1odS5odG1sJykpKXsKICAgICAgICBzaG93X2hyYV90cl9wb3AoKSAlPiUgCiAgICAgICAgc2F2ZVdpZGdldChmaWxlID0gcm9vdF9maWxlKCczLWNvbW11bmljYXRpb24vb3RoZXJzL2h0bWwvaHJhLXRyYWN0cy1odS5odG1sJyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGZjb250YWluZWQgPSBGQUxTRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgbGliZGlyID0gcm9vdF9maWxlKCczLWNvbW11bmljYXRpb24vb3RoZXJzL2h0bWwvaHRtbF9zdXBwb3J0X2ZpbGVzJykpCn0KCmlmKCFmaWxlLmV4aXN0cyhyb290X2ZpbGUoJzMtY29tbXVuaWNhdGlvbi9vdGhlcnMvaHRtbC9ocmEtdHJhY3RzLXBvcGh1Lmh0bWwnKSkpewogICAgICAgIHNob3dfaHJhX3RyX3BvcCgpICU+JSAKICAgICAgICBzYXZlV2lkZ2V0KGZpbGUgPSByb290X2ZpbGUoJzMtY29tbXVuaWNhdGlvbi9vdGhlcnMvaHRtbC9ocmEtdHJhY3RzLXBvcGh1Lmh0bWwnKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZmNvbnRhaW5lZCA9IEZBTFNFLAogICAgICAgICAgICAgICAgICAgICAgICAgICBsaWJkaXIgPSByb290X2ZpbGUoJzMtY29tbXVuaWNhdGlvbi9vdGhlcnMvaHRtbC9odG1sX3N1cHBvcnRfZmlsZXMnKSkKfQoKCmBgYAoKCmBgYHtyIGhyYS1zaG93LXBvcCwgZmlnLmNhcD0nSFJBIENlbnN1cyBUcmFjdHMgKGJ5IFBvcHVsYXRpb24pJ30Kc2hvd19ocmFfdHJfcG9wKCkKCmBgYAoKYGBge3IgaHJhLXNob3ctaHUsIGZpZy5jYXA9J0hSQSBDZW5zdXMgVHJhY3RzIChieSBIb3VzaW5nIFVuaXRzKSd9CnNob3dfaHJhX3RyX2h1KCkKCmBgYAoKYGBge3IgaHJhLXNob3ctcG9waHUsIGZpZy5jYXA9J0hSQSBDZW5zdXMgVHJhY3RzIChieSBQb3B1bGF0aW9uIGluIEhvdXNpbmcgVW5pdHMpJ30Kc2hvd19ocmFfdHJfcG9waHUoKQoKYGBgCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK